home *** CD-ROM | disk | FTP | other *** search
/ Shareware Super Platinum 8 / Shareware Super Platinum 8.iso / mac / EDITORS / COLORCTL.ZIP;1 / TECHNOTE.C < prev   
Encoding:
C/C++ Source or Header  |  1991-10-31  |  8.0 KB  |  170 lines

  1. /*                               INCLUDE FILES                               */
  2. #include <dos.h>
  3. /*                        PROGRAMMER-DEFINED CONSTANTS                       */
  4. #define isdigit(x) ((x) >='0' && (x) <='9')   /* numberic digit? */
  5. #define zindex(x) ((x) < 6 || x == 7 ? x : x == 6 ? 20 : x < 16 ? x+48 : 0 )
  6. /*                            FUNCTION PROTOTYPES                            */
  7. int  zCatoi(char *str);                                   /* C ATOI function */
  8. void zSetAnalogHue(int I, int R, int G, int B);          /* Set analog color */
  9. void zReadAnalogHue(int I);                             /* Read analog color */
  10. void zGetColors();                                      /* Get numberic args */
  11. void zSetDefaultColor(int Index);             /* Set default analog color(s) */
  12.  
  13. int errno;
  14. int I,R,G,B,D,Red,Green,Blue,commandarg;
  15. char **argvs;
  16. int argcs;
  17.  
  18. far main(){
  19.   int cnt1,cnt2,Cur_Red,Cur_Green,Cur_Blue;
  20.  
  21.   argvs=MK_FP(_ES,_DI);                          /* Make far pointer to args */
  22.   argcs=_CX;                                        /* Number of args passed */
  23.   I=0;R=0;B=0;G=0,D=10,Red=0,Green=0,Blue=0;      /* Default Analog settings */
  24.   for (cnt1=0;cnt1<argcs;cnt1++){                         /* Cycle thru args */
  25.     if (argvs[cnt1][0]=='/' && (argvs[cnt1][1]=='S' ||            /* Set arg */
  26.       argvs[cnt1][1]=='s')){
  27.       zGetColors();                                     /* Get passed colors */
  28.       zSetAnalogHue(zindex(I),R,G,B);}                          /* Set color */
  29.     if (argvs[cnt1][0]=='/' && (argvs[cnt1][1]=='R' ||          /* Reset arg */
  30.         argvs[cnt1][1]=='r')){
  31.       if (argcs>1){                               /* If more than one arg... */
  32.         zGetColors();                             /*   assume it's Index=#   */
  33.         zSetDefaultColor(zindex(I));}                     /* Reset one index */
  34.       else                                            /* Only one arg passed */
  35.         for (cnt2=0;cnt2<16;cnt2++)        /* Counter to reset all 16 colors */
  36.           zSetDefaultColor(zindex(cnt2));                     /* Reset index */
  37.     }
  38.     if (argvs[cnt1][0]=='/' && (argvs[cnt1][1]=='f' ||           /* Fade arg */
  39.         argvs[cnt1][1]=='F')){
  40.       zGetColors();                                    /* Get passed coloors */
  41.       zReadAnalogHue(zindex(I));          /* Read in old index analog colors */
  42.       for (cnt2=0;cnt2<64;cnt2++){           /* Set colors in n/64 fractions */
  43.         if (Red>=R)
  44.           Cur_Red=Red-((Red-R)*cnt2/64);
  45.         else
  46.           Cur_Red=Red+((R-Red)*cnt2/64);
  47.         if (Green>=G)
  48.           Cur_Green=Green-((Green-G)*cnt2/64);
  49.         else
  50.           Cur_Green=Green+((G-Green)*cnt2/64);
  51.         if (Blue>=B)
  52.           Cur_Blue=Blue-((Blue-B)*cnt2/64);
  53.         else
  54.           Cur_Blue=Blue+((B-Blue)*cnt2/64);
  55.         zSetAnalogHue(zindex(I),Cur_Red,Cur_Green,Cur_Blue);    /* Set color */
  56.         delay(D);}                                                  /* Delay */
  57.       }
  58.     }
  59.     return;}
  60. /*
  61. …ÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕª
  62. ∫                     Set Analog Hue (color Index)                ∫
  63. »ÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕº
  64.  Parameters: I=Color index to set
  65.                          R=Red gun intensity value
  66.                          G=Green gun intensity value
  67.                          B=Blue gun intensity value
  68.  Prototype:  zSetAnalogHue(I,R,G,B)
  69.  Returns:    NULL
  70. */
  71. static union REGS regs;
  72.  
  73. void zSetAnalogHue(int I, int R, int G, int B){
  74.   regs.h.ah=0x10;                               /* Function 10H, DAC palette */
  75.   regs.h.al=0x10;                                      /* Set a DAC register */
  76.   regs.x.bx=I;                                         /* Color index to set */
  77.   regs.h.ch=G;                                   /* Green gun value, 0 to 63 */
  78.   regs.h.cl=B;                                    /* Blue gun value, 0 to 63 */
  79.   regs.h.dh=R;                                     /* Red gun value, 0 to 63 */
  80.   int86(0x10,®s,®s);                                   /* Call int 10H */
  81.   return;}
  82. /*
  83. …ÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕª
  84. ∫                     Read Analog Hue (color Index)               ∫
  85. »ÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕº
  86.  Parameters: I=Color index to set
  87.  Prototype:  zReadAnalogHue(I)
  88.  Returns:    NULL
  89.  NOTE:       Program sets global variable
  90.              Red, Green, Blue
  91. */
  92. /*           A TYPICAL FUNCTION TO READ A COLOR USING THE VIDEO BIOS         */
  93. void zReadAnalogHue(int I){
  94.   regs.h.ah=0x10;                               /* Function 10H, DAC palette */
  95.   regs.h.al=0x15;                                      /* Set a DAC register */
  96.   regs.x.bx=I;                                        /* Color index to read */
  97.   int86(0x10,®s,®s);                                   /* Call int 10H */
  98.   Green=regs.h.ch;                               /* Green gun value, 0 to 63 */
  99.   Blue=regs.h.cl;                                 /* Blue gun value, 0 to 63 */
  100.   Red=regs.h.dh;                                   /* Red gun value, 0 to 63 */
  101.   return;}
  102. /*
  103. …ÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕª
  104. ∫                      C atio Function (source code)              ∫
  105. »ÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕº
  106.  Parameters: str=string pointer to evaluate
  107.  Prototype:  Catoi(string)
  108.  Returns:    Numeric value of string or 0
  109.  NOTE:       This functions trims leading character looking for
  110.                          numeric data ie. abcde30 would return 30
  111. */
  112. int zCatoi(char *str){
  113.   int n;
  114.  
  115.   while (!isdigit(*str))                                  /* Skip non digits */
  116.     str++;                                              /* Increament string */
  117.   for (n = 0; isdigit(*str); str++)                        /* Get the digits */
  118.     n = n * 10 + (*str - '0');                          /* Calculate integer */
  119.   return(n);}                                          /* Return the integer */
  120. /*
  121. …ÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕª
  122. ∫                      C Get Colors from arguments                ∫
  123. »ÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕº
  124.  Parameters: None
  125.  Prototype:  zGetColors()
  126.  Returns:    None
  127. */
  128. void zGetColors(){
  129.   int r;
  130.  
  131.   for (r=0;r<argcs;r++){                           /* Get numberic arguments */
  132.     if (argvs[r][0]=='r' || argvs[r][0]=='R')
  133.       R=(zCatoi(argvs[r]) > 63 ? 63:zCatoi(argvs[r]));
  134.     if (argvs[r][0]=='g' || argvs[r][0]=='G')
  135.       G=(zCatoi(argvs[r]) > 63 ? 63:zCatoi(argvs[r]));
  136.     if (argvs[r][0]=='b' || argvs[r][0]=='B')
  137.       B=(zCatoi(argvs[r]) > 63 ? 63:zCatoi(argvs[r]));
  138.     if (argvs[r][0]=='i' || argvs[r][0]=='I')
  139.       I=(zCatoi(argvs[r]) > 15 ? 0:zCatoi(argvs[r]));
  140.     if (argvs[r][0]=='d' || argvs[r][0]=='D')
  141.       D=(zCatoi(argvs[r]) > 100 ? 100:zCatoi(argvs[r]));}
  142.   return;}
  143. /*
  144. …ÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕª
  145. ∫                  C SetDefaultColor Proceedure                   ∫
  146. »ÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕÕº
  147.  Parameters: Index=index number (0 - 15)
  148.  Prototype:  zSetDefaultColor(Index)
  149.  Returns:    NULL
  150. */
  151. void zSetDefaultColor(int Index){
  152.   switch (Index){                                /* Set default index colors */
  153.     case 0:  zSetAnalogHue(0,0,0,0);break;
  154.     case 1:  zSetAnalogHue(1,0,0,42);break;
  155.     case 2:  zSetAnalogHue(2,0,42,0);break;
  156.     case 3:  zSetAnalogHue(3,0,42,42);break;
  157.     case 4:  zSetAnalogHue(4,42,0,0);break;
  158.     case 5:  zSetAnalogHue(5,42,0,42);break;
  159.     case 20: zSetAnalogHue(20,42,21,0);break;
  160.     case 7:  zSetAnalogHue(7,42,42,42);break;
  161.     case 56: zSetAnalogHue(56,21,21,21);break;
  162.     case 57: zSetAnalogHue(57,21,21,63);break;
  163.     case 58: zSetAnalogHue(58,21,63,21);break;
  164.     case 59: zSetAnalogHue(59,21,63,63);break;
  165.     case 60: zSetAnalogHue(60,63,21,21);break;
  166.     case 61: zSetAnalogHue(61,63,21,63);break;
  167.     case 62: zSetAnalogHue(62,63,63,21);break;
  168.     case 63: zSetAnalogHue(63,63,63,63);break;}
  169.   return;}
  170.